#pragma once
#include "chat_session_member.hxx"
#include <cstddef>
#include <odb/core.hxx>
#include <odb/nullable.hxx>
#include <string>

namespace ken_im
{

/**
 * @brief 聊天会话类型枚举类
 *
 * ChatSessionType 枚举类定义了两种聊天会话类型：单聊和群聊。
 *
 * 核心功能：
 * - 定义聊天会话类型，用于区分单聊和群聊。
 *
 * 使用示例：
 * @code
 * ChatSessionType sessionType = ChatSessionType::SINGLE;
 * if (sessionType == ChatSessionType::SINGLE) {
 *     // 处理单聊逻辑
 * } else if (sessionType == ChatSessionType::GROUP) {
 *     // 处理群聊逻辑
 * }
 * @endcode
 */
enum class ChatSessionType
{
    SINGLE = 1,
    GROUP = 2
};

#pragma db object table( "chat_session" )
class ChatSession
{
  public:
    ChatSession()
    {
    }
    ChatSession( const std::string &ssid, const std::string &ssname,
                 const ChatSessionType sstype )
        : _chat_session_id( ssid ), _chat_session_name( ssname ),
          _chat_session_type( sstype )
    {
    }

    std::string chat_session_id() const
    {
        return _chat_session_id;
    }
    void chat_session_id( std::string &ssid )
    {
        _chat_session_id = ssid;
    }

    std::string chat_session_name() const
    {
        return _chat_session_name;
    }
    void chat_session_name( std::string &ssname )
    {
        _chat_session_name = ssname;
    }

    ChatSessionType chat_session_type() const
    {
        return _chat_session_type;
    }
    void chat_session_type( ChatSessionType val )
    {
        _chat_session_type = val;
    }

  private:
    friend class odb::access;
#pragma db id auto
    unsigned long _id;
#pragma db type( "varchar(64)" ) index unique
    std::string _chat_session_id;
#pragma db type( "varchar(64)" )
    std::string _chat_session_name;
#pragma db type( "tinyint" )
    ChatSessionType _chat_session_type; // 1-单聊； 2-群聊
};

// 这里条件必须是指定条件：  css::chat_session_type==1 && csm1.user_id=uid &&
// csm2.user_id != csm1.user_id
#pragma db view object( ChatSession = css ) object(                            \
    ChatSessionMember = csm1 : css::_chat_session_id == csm1::_session_id )    \
    object( ChatSessionMember = csm2 : css::_chat_session_id ==                \
                                csm2::_session_id ) query( ( ? ) )
struct SingleChatSession
{
#pragma db column( css::_chat_session_id )
    std::string chat_session_id;
#pragma db column( csm2::_user_id )
    std::string friend_id;
};

// 这里条件必须是指定条件：  css::chat_session_type==2 && csm.user_id=uid
#pragma db view object( ChatSession = css )                                    \
    object( ChatSessionMember = csm : css::_chat_session_id ==                 \
                                csm::_session_id ) query( ( ? ) )
struct GroupChatSession
{
#pragma db column( css::_chat_session_id )
    std::string chat_session_id;
#pragma db column( css::_chat_session_name )
    std::string chat_session_name;
};

} // namespace ken_im